﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace CalculadoraDeMatrizes
{
    public abstract class MatrizBase
    {
        protected bool podeCalcularBool;

        public virtual void Calcular(TextBox[,] matriz1, TextBox[,] matriz2)
        {
            string matriz1_text, matriz2_text;

            for (int i = 0; i < matriz1.GetLength(0); i++)
            {
                for (int j = 0; j < matriz1.GetLength(1); j++)
                {
                    if (matriz1[i, j].Text == string.Empty)
                    {
                        matriz1[i, j].Text = "0";
                    }
                }
            }
            for (int i = 0; i < matriz2.GetLength(0); i++)
            {
                for (int j = 0; j < matriz2.GetLength(1); j++)
                {
                    if (matriz2[i, j].Text == string.Empty)
                    {
                        matriz2[i, j].Text = "0";
                    }
                }
            }

            for (int i = 0; i < matriz1.GetLength(0); i++)
            {
                for (int j = 0; j < matriz1.GetLength(1); j++)
                {
                    for (int z = 0; z < matriz1[i, j].Text.Length; z++)
                    {
                        matriz1_text = matriz1[i, j].Text;


                        if (matriz1_text[z] != '0' && matriz1_text[z] != '1' && matriz1_text[z] != '2' && matriz1_text[z] != '3'
                            && matriz1_text[z] != '4' && matriz1_text[z] != '5' && matriz1_text[z] != '6' && matriz1_text[z] != '7'
                            && matriz1_text[z] != '8' && matriz1_text[z] != '9' && matriz1_text[z] != ',' && matriz1_text[z] != '-')
                        {
                            matriz1[i, j].Text = "0";
                        }
                    }
                }
            }
            for (int i = 0; i < matriz2.GetLength(0); i++)
            {
                for (int j = 0; j < matriz2.GetLength(1); j++)
                {
                    for (int z = 0; z < matriz2[i, j].Text.Length; z++)
                    {
                        matriz2_text = matriz2[i, j].Text;

                        if (matriz2_text[z] != '0' && matriz2_text[z] != '1' && matriz2_text[z] != '2' && matriz2_text[z] != '3'
                            && matriz2_text[z] != '4' && matriz2_text[z] != '5' && matriz2_text[z] != '6' && matriz2_text[z] != '7'
                            && matriz2_text[z] != '8' && matriz2_text[z] != '9' && matriz2_text[z] != ',' && matriz2_text[z] != '-')
                        {
                            matriz2[i, j].Text = "0";
                        }
                    }
                }
            }

            podeCalcularBool = podeCalcular(matriz1, matriz2);
        }

        public abstract bool podeCalcular(TextBox[,] matriz1, TextBox[,] matriz2);

        public static MatrizBase SetarMatriz(string opcaoSelecionada, MatrizBase matrizBase)
        {
            switch (opcaoSelecionada)
            {
                case "SOMAR":
                    matrizBase = new M_Somar();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz2());
                    break;

                case "SUBTRAIR":
                    matrizBase = new M_Subtrair();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz2());
                    break;

                case "TRANSPOSTA":
                    matrizBase = new M_Transposta();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz1());
                    break;

                case "OPOSTA":
                    matrizBase = new M_Oposta();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz1());
                    break;

                case "MULTIPLICAR":
                    matrizBase = new M_Multiplicar();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz2());
                    break;

                case "DETERMINANTE 2X2":
                    matrizBase = new M_Determinante2x2();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz1());
                    break;

                case "DETERMINANTE 3X3":
                    matrizBase = new M_Determinante3x3();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz1());
                    break;

                case "INVERSA 2X2":
                    matrizBase = new M_Inversa2x2();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz1());
                    break;

                case "INVERSA 3X3":
                    matrizBase = new M_Inversa3x3();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz1());
                    break;

                default:
                    matrizBase = new M_Somar();
                    matrizBase.Calcular(Gerador.getInstance().getMatriz1(), Gerador.getInstance().getMatriz2());
                    break;
            }

            return matrizBase;
        }
    }
}